
<!DOCTYPE html>
<html lang="">


<head><meta name="generator" content="Hexo 3.8.0">
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
  <meta name="theme-color" content="#202020">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  <script src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js" async></script>
  
  
    <meta name="keywords" content>
  

  
    <meta name="description" content="linux调优的几个工具">
  
  
  
  <link rel="icon" type="image/x-icon" href="/images/footer-logo.png">
  
  <title>linux调优的几个工具 [ 51AIOps 专注于运维自动化  微信： kaipython ]</title>
  
    <!-- stylesheets list from config.yml -->
    
      <link rel="stylesheet" href="//cdn.bootcss.com/pure/1.0.0/pure-min.css">
    
      <link rel="stylesheet" href="/css/xoxo.css">
    
  
</head>


<body>
  <div class="nav-container">
    <nav class="home-menu pure-menu pure-menu-horizontal">
  <a class="pure-menu-heading" href="/">
    
    <span class="title" style="text-transform:none">51AIOps 专注于运维自动化  微信： kaipython</span>
  </a>

  <ul class="pure-menu-list clearfix">
      
          
            
              <li class="pure-menu-item"><a href="/" class="pure-menu-link">首页</a></li>
            
          
      
  </ul>
   
</nav>

  </div>

  <div class="container" id="content-outer">
    <div class="inner" id="content-inner" style='margin-left:-68px!important'>
      <div class="post-container">
  <article class="post" id="post">
    <header class="post-header text-center">
      <h1 class="title">
        linux调优的几个工具
      </h1>
      <span>
        
        <time class="time" datetime="2020-02-02T16:00:00.000Z">
        2020-02-03
      </time>
        
      </span>
      <span class="slash">/</span>
      <span class="post-meta">
      <span class="post-tags">
        
      </span>
    </span>
      <span class="slash">/</span>
      <span class="read">
      <span id="busuanzi_value_page_pv"></span> 点击
    </span>
      <span class="slash">/</span>
    </header>

    <div class="post-content">
      <p>每次发现系统变慢时，我们通常做的第一件事，就是执行 top 或者 uptime 命令，来了解系统的负载情况。比如像下面这样，我在命令行里输入了 uptime 命令，系统也随即给出了结果。</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ uptime</span><br><span class="line"><span class="number">02</span>:<span class="number">34</span>:<span class="number">03</span> up <span class="number">2</span> days, <span class="number">20</span>:<span class="number">14</span>, <span class="number">1</span> user, load average: <span class="number">0.63</span>, <span class="number">0.83</span>, <span class="number">0.88</span></span><br></pre></td></tr></table></figure>

<p>前面的几列比较简单，它们分别是当前时间、系统运行时间以及正在登录用户数。而最后三个数字呢，依次则是过去 1 分钟、5 分钟、15 分钟的平均负载（Load<br>Average）。</p>
<h4 id="平均负载"><a href="#平均负载" class="headerlink" title="平均负载"></a>平均负载</h4><blockquote>
<p>这个词对很多人来说，可能既熟悉又陌生，我们每天的工作中，也都会提到这个词，但你真正理解它背后的含义吗？</p>
</blockquote>
<p>我猜一定有人会说，平均负载不就是单位时间内的 CPU 使用率吗？上面的 0.63，就代表CPU 使用率是 63%。其实并不是这样，如果你方便的话，可以通过执行 man uptime 命<br>令，来了解平均负载的详细解释。</p>
<p>简单来说，平均负载是指单位时间内，系统处于可运行状态和不可中断状态的平均进程数，也就是平均活跃进程数，它和 CPU 使用率并没有直接关系。这里我先解释下，可运行状态<br>和不可中断状态这俩词儿。</p>
<p>所谓可运行状态的进程，是指正在使用 CPU 或者正在等待 CPU 的进程，也就是我们常用<br>ps 命令看到的，处于 R 状态（Running 或 Runnable）的进程。</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">02</span>:<span class="number">34</span>:<span class="number">03</span> // 当前时间</span><br><span class="line">up <span class="number">2</span> days, <span class="number">20</span>:<span class="number">14</span> // 系统运行时间</span><br><span class="line"><span class="number">1</span> user // 正在登录用户数</span><br></pre></td></tr></table></figure>

<p>不可中断状态的进程则是正处于内核态关键流程中的进程，并且这些流程是不可打断的，比如最常见的是等待硬件设备的 I/O 响应，也就是我们在 ps 命令中看到的 D 状态<br>（Uninterruptible Sleep，也称为 Disk Sleep）的进程。</p>
<p>比如，当一个进程向磁盘读写数据时，为了保证数据的一致性，在得到磁盘回复前，它是不能被其他进程或者中断打断的，这个时候的进程就处于不可中断状态。如果此时的进程被打<br>断了，就容易出现磁盘数据与进程数据不一致的问题。所以，不可中断状态实际上是系统对进程和硬件设备的一种保护机制。因此，你可以简单理解为，平均负载其实就是平均活跃进程数。平均活跃进程数，直观上的理解就是单位时间内的活跃进程数，但它实际上是活跃进程数的指数衰减平均值。这个“指数衰减平均”的详细含义你不用计较，这只是系统的一种更快速的计算方式，你把它直接当成活跃进程数的平均值也没问题。</p>
<p>既然平均的是活跃进程数，那么最理想的，就是每个 CPU 上都刚好运行着一个进程，这样每个 CPU 都得到了充分利用。比如当平均负载为 2 时，意味着什么呢？</p>
<h4 id="平均负载为多少时合理"><a href="#平均负载为多少时合理" class="headerlink" title="平均负载为多少时合理"></a>平均负载为多少时合理</h4><p>讲完了什么是平均负载，现在我们再回到最开始的例子，不知道你能否判断出，在 uptime命令的结果里，那三个时间段的平均负载数，多大的时候能说明系统负载高？或是多小的时<br>候就能说明系统负载很低呢？</p>
<p>我们知道，平均负载最理想的情况是等于 CPU 个数。所以在评判平均负载时，首先你要知道系统有几个 CPU，这可以通过 top 命令或者从文件 /proc/cpuinfo 中读取，比如：<br>在只有 2 个 CPU 的系统上，意味着所有的 CPU 都刚好被完全占用。</p>
<p>在 4 个 CPU 的系统上，意味着 CPU 有 50% 的空闲。而在只有 1 个 CPU 的系统中，则意味着有一半的进程竞争不到 CPU。</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 关于 grep 和 wc 的用法请查询它们的手册或者网络搜索</span></span><br><span class="line">$ grep <span class="string">'model name'</span> /proc/cpuinfo | wc -l</span><br></pre></td></tr></table></figure>

<p>有了 CPU 个数，我们就可以判断出，当平均负载比 CPU 个数还大的时候，系统已经出现了过载。<br>不过，且慢，新的问题又来了。我们在例子中可以看到，平均负载有三个数值，到底该参考哪一个呢？</p>
<p>实际上，都要看。三个不同时间间隔的平均值，其实给我们提供了，分析系统负载趋势的数据来源，让我们能更全面、更立体地理解目前的负载状况。<br>打个比方，就像初秋时北京的天气，如果只看中午的温度，你可能以为还在 7 月份的大夏天呢。但如果你结合了早上、中午、晚上三个时间点的温度来看，基本就可以全方位了解这<br>一天的天气情况了。同样的，前面说到的 CPU 的三个负载时间段也是这个道理。</p>
<p>这里我再举个例子，假设我们在一个单 CPU 系统上看到平均负载为 1.73，0.60，7.98，那么说明在过去 1 分钟内，系统有 73% 的超载，而在 15 分钟内，有 698% 的超载，从整体趋势来看，系统的负载在降低。</p>
<p>那么，在实际生产环境中，平均负载多高时，需要我们重点关注呢？</p>
<p>在我看来，当平均负载高于 CPU 数量 70% 的时候，你就应该分析排查负载高的问题了。一旦负载过高，就可能导致进程响应变慢，进而影响服务的正常功能。<br>如果 1 分钟、5 分钟、15 分钟的三个值基本相同，或者相差不大，那就说明系统负载很平稳。但如果 1 分钟的值远小于 15 分钟的值，就说明系统最近 1 分钟的负载在减少，而过去15 分钟内却有很大的负载。</p>
<p>反过来，如果 1 分钟的值远大于 15 分钟的值，就说明最近 1 分钟的负载在增加，这种增加有可能只是临时性的，也有可能还会持续增加下去，所以就需要持续观察。一旦 1<br>分钟的平均负载接近或超过了 CPU 的个数，就意味着系统正在发生过载的问题，这时就得分析调查是哪里导致的问题，并要想办法优化了。但 70% 这个数字并不是绝对的，最推荐的方法，还是把系统的平均负载监控起来，然后根据更多的历史数据，判断负载的变化趋势。当发现负载有明显升高趋势时，比如说负载翻倍<br>了，你再去做分析和调查。</p>
<h4 id="平均负载与-CPU-使用率"><a href="#平均负载与-CPU-使用率" class="headerlink" title="平均负载与 CPU 使用率"></a>平均负载与 CPU 使用率</h4><p>现实工作中，我们经常容易把平均负载和 CPU 使用率混淆，所以在这里，我也做一个区分。</p>
<p>可能你会疑惑，既然平均负载代表的是活跃进程数，那平均负载高了，不就意味着 CPU 使用率高吗？</p>
<p>我们还是要回到平均负载的含义上来，平均负载是指单位时间内，处于可运行状态和不可中断状态的进程数。所以，它不仅包括了正在使用 CPU 的进程，还包括等待 CPU 和等待<br>I/O 的进程。</p>
<p>而 CPU 使用率，是单位时间内 CPU 繁忙情况的统计，跟平均负载并不一定完全对应。</p>
<h4 id="平均负载案例分析"><a href="#平均负载案例分析" class="headerlink" title="平均负载案例分析"></a>平均负载案例分析</h4><p>下面，我们以三个示例分别来看这三种情况，并用 iostat、mpstat、pidstat 等工具，找出平均负载升高的根源。</p>
<p>我使用的案例环境如下所示。</p>
<p>CPU 密集型进程，使用大量 CPU 会导致平均负载升高，此时这两者是一致的；<br>I/O 密集型进程，等待 I/O 也会导致平均负载升高，但 CPU 使用率不一定很高；<br>大量等待 CPU 的进程调度也会导致平均负载升高，此时的 CPU 使用率也会比较高。</p>
<p>在这里，我先简单介绍一下 stress 和 sysstat。</p>
<blockquote>
<p>stress 是一个 Linux 系统压力测试工具，这里我们用作异常进程模拟平均负载升高的场景。</p>
</blockquote>
<p>而 sysstat 包含了常用的 Linux 性能工具，用来监控和分析系统的性能。我们的案例会用到这个包的两个命令 mpstat 和 pidstat。<br>此外，每个场景都需要你开三个终端，登录到同一台 Linux 机器中。</p>
<p>实验之前，你先做好上面的准备。如果包的安装有问题，可以先在 Google 一下自行解决，如果还是解决不了，再来留言区找我，这事儿应该不难。<br>另外要注意，下面的所有命令，我们都是默认以 root 用户运行。所以，如果你是用普通用户登陆的系统，一定要先运行 sudo su root 命令切换到 root 用户。<br>如果上面的要求都已经完成了，你可以先用 uptime 命令，看一下测试前的平均负载情况：</p>
<h5 id="场景一：CPU-密集型进程"><a href="#场景一：CPU-密集型进程" class="headerlink" title="场景一：CPU 密集型进程"></a>场景一：CPU 密集型进程</h5><p>首先，我们在第一个终端运行 stress 命令，模拟一个 CPU 使用率 100% 的场景：<br>机器配置：2 CPU，8GB 内存。<br>预先安装 stress 和 sysstat 包，如 apt install stress sysstat。<br>mpstat 是一个常用的多核 CPU 性能分析工具，用来实时查看每个 CPU 的性能指标，以<br>及所有 CPU 的平均指标。<br>pidstat 是一个常用的进程性能分析工具，用来实时查看进程的 CPU、内存、I/O 以及上<br>下文切换等性能指标。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ uptime</span><br><span class="line">..., load average: 0.11, 0.15, 0.09</span><br></pre></td></tr></table></figure>

<p>接着，在第二个终端运行 uptime 查看平均负载的变化情况：<br>最后，在第三个终端运行 mpstat 查看 CPU 使用率的变化情况：<br>从终端二中可以看到，1 分钟的平均负载会慢慢增加到 1.00，而从终端三中还可以看到，<br>正好有一个 CPU 的使用率为 100%，但它的 iowait 只有 0。这说明，平均负载的升高正是<br>由于 CPU 使用率为 100% 。<br>那么，到底是哪个进程导致了 CPU 使用率为 100% 呢？你可以使用 pidstat 来查询：</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">1</span> $ stress --cpu <span class="number">1</span> --timeout <span class="number">600</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># -d 参数表示高亮显示变化的区域</span></span><br><span class="line">$ watch -d uptime</span><br><span class="line">..., load average: <span class="number">1.00</span>, <span class="number">0.75</span>, <span class="number">0.39</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># -P ALL 表示监控所有 CPU，后面数字 5 表示间隔 5 秒后输出一组数据</span></span><br><span class="line">$ mpstat -P ALL <span class="number">5</span></span><br><span class="line">Linux <span class="number">4.15</span><span class="number">.0</span> (ubuntu) <span class="number">09</span>/<span class="number">22</span>/<span class="number">18</span> _x86_64_ (<span class="number">2</span> CPU)</span><br><span class="line"><span class="number">13</span>:<span class="number">30</span>:<span class="number">06</span> CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice</span><br><span class="line"><span class="number">13</span>:<span class="number">30</span>:<span class="number">11</span> all <span class="number">50.05</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span></span><br><span class="line"><span class="number">13</span>:<span class="number">30</span>:<span class="number">11</span> <span class="number">0</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span></span><br><span class="line"><span class="number">13</span>:<span class="number">30</span>:<span class="number">11</span> <span class="number">1</span> <span class="number">100.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span></span><br></pre></td></tr></table></figure>

<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 间隔 5 秒后输出一组数据</span></span><br><span class="line">$ pidstat -u <span class="number">5</span> <span class="number">1</span></span><br><span class="line"><span class="number">13</span>:<span class="number">37</span>:<span class="number">07</span> UID PID %usr %system %guest %wait %CPU CPU Command</span><br><span class="line"><span class="number">13</span>:<span class="number">37</span>:<span class="number">12</span> <span class="number">0</span> <span class="number">2962</span> <span class="number">100.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">100.00</span> <span class="number">1</span> stress</span><br></pre></td></tr></table></figure>

<p>从这里可以明显看到，stress 进程的 CPU 使用率为 100%。</p>
<h5 id="场景二：I-O-密集型进程"><a href="#场景二：I-O-密集型进程" class="headerlink" title="场景二：I/O 密集型进程"></a>场景二：I/O 密集型进程</h5><p>首先还是运行 stress 命令，但这次模拟 I/O 压力，即不停地执行 sync：<br>还是在第二个终端运行 uptime 查看平均负载的变化情况：<br>然后，第三个终端运行 mpstat 查看 CPU 使用率的变化情况：<br>从这里可以看到，1 分钟的平均负载会慢慢增加到 1.06，其中一个 CPU 的系统 CPU 使用<br>率升高到了 23.87，而 iowait 高达 67.53%。这说明，平均负载的升高是由于 iowait 的升高。<br>那么到底是哪个进程，导致 iowait 这么高呢？我们还是用 pidstat 来查询：</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">1</span> $ stress -i <span class="number">1</span> --timeout <span class="number">600</span></span><br><span class="line"></span><br><span class="line">$ watch -d uptime</span><br><span class="line">..., load average: <span class="number">1.06</span>, <span class="number">0.58</span>, <span class="number">0.37</span></span><br></pre></td></tr></table></figure>

<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 显示所有 CPU 的指标，并在间隔 5 秒输出一组数据</span></span><br><span class="line">$ mpstat -P ALL <span class="number">5</span> <span class="number">1</span></span><br><span class="line">Linux <span class="number">4.15</span><span class="number">.0</span> (ubuntu) <span class="number">09</span>/<span class="number">22</span>/<span class="number">18</span> _x86_64_ (<span class="number">2</span> CPU)</span><br><span class="line"><span class="number">13</span>:<span class="number">41</span>:<span class="number">28</span> CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice</span><br><span class="line"><span class="number">13</span>:<span class="number">41</span>:<span class="number">33</span> all <span class="number">0.21</span> <span class="number">0.00</span> <span class="number">12.07</span> <span class="number">32.67</span> <span class="number">0.00</span> <span class="number">0.21</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span></span><br><span class="line"><span class="number">13</span>:<span class="number">41</span>:<span class="number">33</span> <span class="number">0</span> <span class="number">0.43</span> <span class="number">0.00</span> <span class="number">23.87</span> <span class="number">67.53</span> <span class="number">0.00</span> <span class="number">0.43</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span></span><br><span class="line"><span class="number">13</span>:<span class="number">41</span>:<span class="number">33</span> <span class="number">1</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.81</span> <span class="number">0.20</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.00</span></span><br></pre></td></tr></table></figure>

<p>间隔 5 秒后输出一组数据，-u 表示 CPU 指标</p>
<p>可以发现，还是 stress 进程导致的。</p>
<h5 id="场景三：大量进程的场景"><a href="#场景三：大量进程的场景" class="headerlink" title="场景三：大量进程的场景"></a>场景三：大量进程的场景</h5><p>当系统中运行进程超出 CPU 运行能力时，就会出现等待 CPU 的进程。<br>比如，我们还是使用 stress，但这次模拟的是 8 个进程：<br>由于系统只有 2 个 CPU，明显比 8 个进程要少得多，因而，系统的 CPU 处于严重过载状态，平均负载高达 7.97：<br>接着再运行 pidstat 来看一下进程的情况：</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">$ pidstat -u <span class="number">5</span> <span class="number">1</span></span><br><span class="line">Linux <span class="number">4.15</span><span class="number">.0</span> (ubuntu) <span class="number">09</span>/<span class="number">22</span>/<span class="number">18</span> _x86_64_ (<span class="number">2</span> CPU)</span><br><span class="line"><span class="number">13</span>:<span class="number">42</span>:<span class="number">08</span> UID PID %usr %system %guest %wait %CPU CPU Command</span><br><span class="line"><span class="number">13</span>:<span class="number">42</span>:<span class="number">13</span> <span class="number">0</span> <span class="number">104</span> <span class="number">0.00</span> <span class="number">3.39</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">3.39</span> <span class="number">1</span> kworker/<span class="number">1</span>:<span class="number">1</span>H</span><br><span class="line"><span class="number">13</span>:<span class="number">42</span>:<span class="number">13</span> <span class="number">0</span> <span class="number">109</span> <span class="number">0.00</span> <span class="number">0.40</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.40</span> <span class="number">0</span> kworker/<span class="number">0</span>:<span class="number">1</span>H</span><br><span class="line"><span class="number">13</span>:<span class="number">42</span>:<span class="number">13</span> <span class="number">0</span> <span class="number">2997</span> <span class="number">2.00</span> <span class="number">35.53</span> <span class="number">0.00</span> <span class="number">3.99</span> <span class="number">37.52</span> <span class="number">1</span> stress</span><br><span class="line"><span class="number">13</span>:<span class="number">42</span>:<span class="number">13</span> <span class="number">0</span> <span class="number">3057</span> <span class="number">0.00</span> <span class="number">0.40</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">0.40</span> <span class="number">0</span> pidstat</span><br><span class="line"><span class="number">1</span> $ stress -c <span class="number">8</span> --timeout <span class="number">600</span></span><br><span class="line"></span><br><span class="line">$ uptime</span><br><span class="line">..., load average: <span class="number">7.97</span>, <span class="number">5.93</span>, <span class="number">3.02</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 间隔 5 秒后输出一组数据</span></span><br><span class="line">$ pidstat -u <span class="number">5</span> <span class="number">1</span></span><br><span class="line"><span class="number">14</span>:<span class="number">23</span>:<span class="number">25</span> UID PID %usr %system %guest %wait %CPU CPU Command</span><br><span class="line"><span class="number">14</span>:<span class="number">23</span>:<span class="number">30</span> <span class="number">0</span> <span class="number">3190</span> <span class="number">25.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">74.80</span> <span class="number">25.00</span> <span class="number">0</span> stress</span><br><span class="line"><span class="number">14</span>:<span class="number">23</span>:<span class="number">30</span> <span class="number">0</span> <span class="number">3191</span> <span class="number">25.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">75.20</span> <span class="number">25.00</span> <span class="number">0</span> stress</span><br><span class="line"><span class="number">14</span>:<span class="number">23</span>:<span class="number">30</span> <span class="number">0</span> <span class="number">3192</span> <span class="number">25.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">74.80</span> <span class="number">25.00</span> <span class="number">1</span> stress</span><br><span class="line"><span class="number">14</span>:<span class="number">23</span>:<span class="number">30</span> <span class="number">0</span> <span class="number">3193</span> <span class="number">25.00</span> <span class="number">0.00</span> <span class="number">0.00</span> <span class="number">75.00</span> <span class="number">25.00</span> <span class="number">1</span> stress</span><br></pre></td></tr></table></figure>

<p>可以看出，8 个进程在争抢 2 个 CPU，每个进程等待 CPU 的时间（也就是代码块中的<br>%wait 列）高达 75%。这些超出 CPU 计算能力的进程，最终导致 CPU 过载。</p>

    </div>

  </article>
  <div class="toc-container">
    
  <div id="toc" class="toc-article">
    <strong class="toc-title">目录</strong>
    <ol class="toc"><li class="toc-item toc-level-4"><a class="toc-link" href="#平均负载"><span class="toc-text">平均负载</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#平均负载为多少时合理"><span class="toc-text">平均负载为多少时合理</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#平均负载与-CPU-使用率"><span class="toc-text">平均负载与 CPU 使用率</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#平均负载案例分析"><span class="toc-text">平均负载案例分析</span></a><ol class="toc-child"><li class="toc-item toc-level-5"><a class="toc-link" href="#场景一：CPU-密集型进程"><span class="toc-text">场景一：CPU 密集型进程</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#场景二：I-O-密集型进程"><span class="toc-text">场景二：I/O 密集型进程</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#场景三：大量进程的场景"><span class="toc-text">场景三：大量进程的场景</span></a></li></ol></li></ol>
  </div>


  </div>
</div>
<script type="text/javascript" src="//rf.revolvermaps.com/0/0/8.js?i=5sr5du46f27&amp;m=0&amp;c=ff0000&amp;cr1=ffffff&amp;f=arial&amp;l=33" async="async"></script>
<div class="copyright">
    <span>本作品采用</span>
    <a href="https://creativecommons.org/licenses/by/4.0/">知识共享署名 4.0 国际许可协议</a>
    <span>进行许可。 转载时请注明原文链接。</span>
</div>


  
    <div class="post-nav" style="margin-left:-168px;">
      <div class="post-nav-item post-nav-next">
        
          <span>〈 </span>
          <a href="/2020/01/02/LGTM,那些迷之缩写/" rel="next" title="LGTM? 那些迷之缩写">
          LGTM? 那些迷之缩写
          </a>
        
      </div>
  
      <div class="post-nav-item post-nav-prev">
          
          <a href="/2020/02/12/grpc的介绍/" rel="prev" title="GRPC初识">
            GRPC初识
          </a>
          <span>〉</span>
        
      </div>
    </div>
  


	
	<div style="width:109%; margin-left:-144px" id="lv-container" data-id="city" data-uid="MTAyMC80OTg5NS8yNjM4Ng==">
	<script type="text/javascript">
   	   (function(d, s) {
       		var j, e = d.getElementsByTagName(s)[0];

       		if (typeof LivereTower === 'function') { return; }

       		j = d.createElement(s);
       		j.src = 'https://cdn-city.livere.com/js/embed.dist.js';
       		j.async = true;

       		e.parentNode.insertBefore(j, e);
   	   })(document, 'script');
	</script>
	<noscript> 为正常使用来必力评论功能请激活JavaScript</noscript>
        </div>
	



    </div>

    

  </div>
  <footer class="footer text-center">
    <div id="bottom-inner">
        <a class="bottom-item" href target="_blank">GitHub</a> |
        <a class="bottom-item" href>友情链接</a> |
        <a class="bottom-item" href="https://hexo.io" target="_blank">Powered by hexo</a> |
        <a class="bottom-item" href="https://github.com/fooying/hexo-theme-xoxo-plus" target="_blank">Theme xoxo-plus</a> |
        <a class="bottom-item" href="/atom.xml">订阅</a>
    </div>
</footer>

  

<script>
  (function(window, document, undefined) {

    var timer = null;

    function returnTop() {
      cancelAnimationFrame(timer);
      timer = requestAnimationFrame(function fn() {
        var oTop = document.body.scrollTop || document.documentElement.scrollTop;
        if (oTop > 0) {
          document.body.scrollTop = document.documentElement.scrollTop = oTop - 50;
          timer = requestAnimationFrame(fn);
        } else {
          cancelAnimationFrame(timer);
        }
      });
    }

    var hearts = [];
    window.requestAnimationFrame = (function() {
      return window.requestAnimationFrame ||
        window.webkitRequestAnimationFrame ||
        window.mozRequestAnimationFrame ||
        window.oRequestAnimationFrame ||
        window.msRequestAnimationFrame ||
        function(callback) {
          setTimeout(callback, 1000 / 60);
        }
    })();
    init();

    function init() {
      css(".heart{z-index:9999;width: 10px;height: 10px;position: fixed;background: #f00;transform: rotate(45deg);-webkit-transform: rotate(45deg);-moz-transform: rotate(45deg);}.heart:after,.heart:before{content: '';width: inherit;height: inherit;background: inherit;border-radius: 50%;-webkit-border-radius: 50%;-moz-border-radius: 50%;position: absolute;}.heart:after{top: -5px;}.heart:before{left: -5px;}");
      attachEvent();
      gameloop();
      addMenuEvent();
    }

    function gameloop() {
      for (var i = 0; i < hearts.length; i++) {
        if (hearts[i].alpha <= 0) {
          document.body.removeChild(hearts[i].el);
          hearts.splice(i, 1);
          continue;
        }
        hearts[i].y--;
        hearts[i].scale += 0.004;
        hearts[i].alpha -= 0.013;
        hearts[i].el.style.cssText = "left:" + hearts[i].x + "px;top:" + hearts[i].y + "px;opacity:" + hearts[i].alpha + ";transform:scale(" + hearts[i].scale + "," + hearts[i].scale + ") rotate(45deg);background:" + hearts[i].color;
      }
      requestAnimationFrame(gameloop);
    }

    /**
     * 给logo设置点击事件
     * 
     * - 回到顶部
     * - 出现爱心
     */
    function attachEvent() {
      var old = typeof window.onclick === "function" && window.onclick;
      var logo = document.getElementById("logo");
      if (logo) {
        logo.onclick = function(event) {
          returnTop();
          old && old();
          createHeart(event);
        }
      }
      
    }

    function createHeart(event) {
      var d = document.createElement("div");
      d.className = "heart";
      hearts.push({
        el: d,
        x: event.clientX - 5,
        y: event.clientY - 5,
        scale: 1,
        alpha: 1,
        color: randomColor()
      });
      document.body.appendChild(d);
    }

    function css(css) {
      var style = document.createElement("style");
      style.type = "text/css";
      try {
        style.appendChild(document.createTextNode(css));
      } catch (ex) {
        style.styleSheet.cssText = css;
      }
      document.getElementsByTagName('head')[0].appendChild(style);
    }

    function randomColor() {
      // return "rgb(" + (~~(Math.random() * 255)) + "," + (~~(Math.random() * 255)) + "," + (~~(Math.random() * 255)) + ")";
      return "#F44336";
    }

    function addMenuEvent() {
      var menu = document.getElementById('menu-main-post');
      if (menu) {
        var toc = document.getElementById('toc');
        if (toc) {
          menu.onclick = function() {
            if (toc) {
              if (toc.style.display == 'block') {
                toc.style.display = 'none';
              } else {
                toc.style.display = 'block';
              }
            }
          };
        } else {
          menu.style.display = 'none';
        }
      }
    }

  })(window, document);
</script>

  



  

</body>
</html>
